# -*- encoding: utf-8 -*-

"""
------------------------------------------
@File       : coroutine_parallel_by_task.py
@Author     : maixiaochai
@Email      : maixiaochai@outlook.com
@CreatedOn  : 2021/9/16 16:16
------------------------------------------
"""
from time import time
from asyncio import sleep, get_event_loop, ensure_future


async def test_a(x):
    print('in test a')
    await sleep(3)
    print('resuming a')
    return x


async def test_b(x):
    print('in test b')
    await sleep(1)
    print('resuming b')
    return x


async def main():
    start = time()

    # 这里从创建 task也可以用 create_task,
    # ensure_future内部也调用了 create_task
    task_a = ensure_future(test_a(1))
    task_b = ensure_future(test_b(2))

    print(task_a)
    print(task_b)
    print(task_a.done(), task_b.done())
    await task_a
    await task_b
    print(task_a.done(), task_b.done())

    print(task_a.result())
    print(task_b.result())

    time_cost = round(time() - start, 2)
    print(f"Time cost: {time_cost} s")


if __name__ == '__main__':
    """
    Out:
        <Task pending name='Task-2' coro=<test_a() running at E:\Code\github\multiTasking\others\coroutine_parallel_by_gather.py:15>>
        <Task pending name='Task-3' coro=<test_b() running at E:\Code\github\multiTasking\others\coroutine_parallel_by_gather.py:22>>
        False False
        in test a
        in test b
        resuming b
        resuming a
        True True
        1
        2
        Time cost: 3.0 s
        
    执行说明：
        使用 asyncio.ensure_future(test_a(1))返回一个 task对象，此时 task进入 pending状态,并没有执行。
        这时 print(task_a) 得到<xxx> 些时，task_a.done()返回 False,表示它还没有结束。
        当调用 await task_a时表示开始执行该协程，当执行结束以后，task_a.done() 返回 True，
        这时可以调用 task_a.result()得到函数的返回值。
    
    注意：如果协程还没有结束就调用 result()方法则会抛个异常，raise InvalidStateError('Result is not ready.')
    """
    loop = get_event_loop()
    loop.run_until_complete(main())
